package com.nifostasky.pattern.producer;

import com.nifostasky.pattern.config.RabbitFanoutConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 发布订阅模式
 * 在生产者和队列之间多了个交换机（X），此时的交换机类型为：扇形交换机（Fanout Exchange）。
 *
 * 事实上，简单模式和工作模式也都有自己的Exchange，只不过不用显性的声明，因为默认使用default Exchange。
 *
 * 扇形交换机：一个发送到Exchange的消息都会被转发到与该交换机绑定的所有队列上。
 *
 *
 *
 *
 * 发布订阅模式与工作队列模式的区别
 *
 * 1、工作队列模式不用定义交换机，而发布/订阅模式需要定义交换机。
 *
 * 2、发布/订阅模式的生产方是面向交换机发送消息，工作队列模式的生产方是面向队列发送消息(底层使用默认交换机)。
 *
 * 3、发布/订阅模式需要设置队列和交换机的绑定，工作队列模式不需要设置，实际上工作队列模式会将队列绑定到默认的交换机 。
 */
@Component
public class ExchangePattern {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendWithFanout() {
        rabbitTemplate.convertAndSend(RabbitFanoutConfig.EXCHANGE_NAME, "", "fanout mq hello~~~");
        // 指定一个routingKey 看消费方能不能正常接收消息
        rabbitTemplate.convertAndSend(RabbitFanoutConfig.EXCHANGE_NAME, "abc", "fanout2 mq hello~~~");
    }
}
